{
 "cells": [
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "运⾏课上给出的notebook的代码： \n",
    "1. 对连续型特征，可以用哪个函数可视化其分布？（给出你最常用的一个即可），并根据代码运行结果给出示例。 \n",
    "2. 对两个连续型特征，可以用哪个函数得到这两个特征之间的相关性？根据代码运行结果，给出示例。 \n",
    "3. 如果发现特征之间有较强的相关性，在选择线性回归模型时应该采取什么措施。 \n",
    "4. 当采用带正则的模型以及采用随机梯度下降优化算法时，需要对输入（连续型）特征进行去量纲预处理。课程代码给出了用标准化（StandardScaler）的结果，请改成最小最大缩放（MinMaxScaler）去量纲 ，并重新训练最小二乘线性回归、岭回归、和Lasso模型。 \n",
    "5. 代码中给出了岭回归（RidgeCV）和Lasso（LassoCV）超参数（alpha_）调优的过程，请结合两个最佳模型以及最小二乘线性回归模型的结果，给出什么场合应该用岭回归，什么场合用Lasso，什么场合用最小二乘。"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "# 1. 对连续型特征，可以用哪个函数可视化其分布？（给出你最常用的一个即可），并根据代码运行结果给出示例。 "
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 2,
   "metadata": {},
   "outputs": [],
   "source": [
    "# -*- coding:utf-8 -*-\n",
    "import sys\n",
    "import numpy as np # linear algebra\n",
    "import pandas as pd # data processing, CSV file I/O\n",
    "\n",
    "import matplotlib.pyplot as plt\n",
    "import seaborn as sns\n",
    "\n",
    "%matplotlib inline"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 3,
   "metadata": {},
   "outputs": [],
   "source": [
    "df = pd.read_csv(\"boston_housing.csv\")"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 4,
   "metadata": {},
   "outputs": [
    {
     "data": {
      "text/plain": [
       "<function matplotlib.pyplot.show(*args, **kw)>"
      ]
     },
     "execution_count": 4,
     "metadata": {},
     "output_type": "execute_result"
    },
    {
     "data": {
      "image/png": "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\n",
      "text/plain": [
       "<Figure size 432x288 with 1 Axes>"
      ]
     },
     "metadata": {
      "needs_background": "light"
     },
     "output_type": "display_data"
    }
   ],
   "source": [
    "# 直方图\n",
    "fig = plt.figure()\n",
    "sns.distplot(df['MEDV'], bins = 30, kde = True)\n",
    "plt.xlabel(\"Median value of owner-occupied homes\", fontsize=12)\n",
    "plt.show"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "- 直方图可以反映数值从小到大的频率分布规律\n",
    "- kde是核密度估计，能平滑地展现数值分布特征"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "# 2. 对两个连续型特征，可以用哪个函数得到这两个特征之间的相关性？根据代码运行结果，给出示例。 \n"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 5,
   "metadata": {},
   "outputs": [
    {
     "data": {
      "text/html": [
       "<div>\n",
       "<style scoped>\n",
       "    .dataframe tbody tr th:only-of-type {\n",
       "        vertical-align: middle;\n",
       "    }\n",
       "\n",
       "    .dataframe tbody tr th {\n",
       "        vertical-align: top;\n",
       "    }\n",
       "\n",
       "    .dataframe thead th {\n",
       "        text-align: right;\n",
       "    }\n",
       "</style>\n",
       "<table border=\"1\" class=\"dataframe\">\n",
       "  <thead>\n",
       "    <tr style=\"text-align: right;\">\n",
       "      <th></th>\n",
       "      <th>CRIM</th>\n",
       "      <th>ZN</th>\n",
       "      <th>INDUS</th>\n",
       "      <th>CHAS</th>\n",
       "      <th>NOX</th>\n",
       "      <th>RM</th>\n",
       "      <th>AGE</th>\n",
       "      <th>DIS</th>\n",
       "      <th>RAD</th>\n",
       "      <th>TAX</th>\n",
       "      <th>PTRATIO</th>\n",
       "      <th>B</th>\n",
       "      <th>LSTAT</th>\n",
       "      <th>MEDV</th>\n",
       "    </tr>\n",
       "  </thead>\n",
       "  <tbody>\n",
       "    <tr>\n",
       "      <th>0</th>\n",
       "      <td>0.00632</td>\n",
       "      <td>18</td>\n",
       "      <td>2.31</td>\n",
       "      <td>0</td>\n",
       "      <td>0.538</td>\n",
       "      <td>6.575</td>\n",
       "      <td>65.2</td>\n",
       "      <td>4.0900</td>\n",
       "      <td>1</td>\n",
       "      <td>296</td>\n",
       "      <td>15</td>\n",
       "      <td>396.90</td>\n",
       "      <td>4.98</td>\n",
       "      <td>24.0</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>1</th>\n",
       "      <td>0.02731</td>\n",
       "      <td>0</td>\n",
       "      <td>7.07</td>\n",
       "      <td>0</td>\n",
       "      <td>0.469</td>\n",
       "      <td>6.421</td>\n",
       "      <td>78.9</td>\n",
       "      <td>4.9671</td>\n",
       "      <td>2</td>\n",
       "      <td>242</td>\n",
       "      <td>17</td>\n",
       "      <td>396.90</td>\n",
       "      <td>9.14</td>\n",
       "      <td>21.6</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>2</th>\n",
       "      <td>0.02729</td>\n",
       "      <td>0</td>\n",
       "      <td>7.07</td>\n",
       "      <td>0</td>\n",
       "      <td>0.469</td>\n",
       "      <td>7.185</td>\n",
       "      <td>61.1</td>\n",
       "      <td>4.9671</td>\n",
       "      <td>2</td>\n",
       "      <td>242</td>\n",
       "      <td>17</td>\n",
       "      <td>392.83</td>\n",
       "      <td>4.03</td>\n",
       "      <td>34.7</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>3</th>\n",
       "      <td>0.03237</td>\n",
       "      <td>0</td>\n",
       "      <td>2.18</td>\n",
       "      <td>0</td>\n",
       "      <td>0.458</td>\n",
       "      <td>6.998</td>\n",
       "      <td>45.8</td>\n",
       "      <td>6.0622</td>\n",
       "      <td>3</td>\n",
       "      <td>222</td>\n",
       "      <td>18</td>\n",
       "      <td>394.63</td>\n",
       "      <td>2.94</td>\n",
       "      <td>33.4</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>4</th>\n",
       "      <td>0.06905</td>\n",
       "      <td>0</td>\n",
       "      <td>2.18</td>\n",
       "      <td>0</td>\n",
       "      <td>0.458</td>\n",
       "      <td>7.147</td>\n",
       "      <td>54.2</td>\n",
       "      <td>6.0622</td>\n",
       "      <td>3</td>\n",
       "      <td>222</td>\n",
       "      <td>18</td>\n",
       "      <td>396.90</td>\n",
       "      <td>5.33</td>\n",
       "      <td>36.2</td>\n",
       "    </tr>\n",
       "  </tbody>\n",
       "</table>\n",
       "</div>"
      ],
      "text/plain": [
       "      CRIM  ZN  INDUS  CHAS    NOX     RM   AGE     DIS  RAD  TAX  PTRATIO  \\\n",
       "0  0.00632  18   2.31     0  0.538  6.575  65.2  4.0900    1  296       15   \n",
       "1  0.02731   0   7.07     0  0.469  6.421  78.9  4.9671    2  242       17   \n",
       "2  0.02729   0   7.07     0  0.469  7.185  61.1  4.9671    2  242       17   \n",
       "3  0.03237   0   2.18     0  0.458  6.998  45.8  6.0622    3  222       18   \n",
       "4  0.06905   0   2.18     0  0.458  7.147  54.2  6.0622    3  222       18   \n",
       "\n",
       "        B  LSTAT  MEDV  \n",
       "0  396.90   4.98  24.0  \n",
       "1  396.90   9.14  21.6  \n",
       "2  392.83   4.03  34.7  \n",
       "3  394.63   2.94  33.4  \n",
       "4  396.90   5.33  36.2  "
      ]
     },
     "execution_count": 5,
     "metadata": {},
     "output_type": "execute_result"
    }
   ],
   "source": [
    "df.head()"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 6,
   "metadata": {},
   "outputs": [
    {
     "data": {
      "text/plain": [
       "<matplotlib.axes._subplots.AxesSubplot at 0x1957cbace80>"
      ]
     },
     "execution_count": 6,
     "metadata": {},
     "output_type": "execute_result"
    },
    {
     "data": {
      "image/png": "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\n",
      "text/plain": [
       "<Figure size 432x288 with 2 Axes>"
      ]
     },
     "metadata": {
      "needs_background": "light"
     },
     "output_type": "display_data"
    }
   ],
   "source": [
    "# 分析AGE与MEDV的相关性\n",
    "cols = df[['AGE', 'MEDV']].columns\n",
    "df_corr = df[['AGE', 'MEDV']]\n",
    "# print(df_corr.head)\n",
    "data_corr = df_corr.corr()\n",
    "sns.heatmap(data_corr, annot = True)"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 7,
   "metadata": {},
   "outputs": [
    {
     "data": {
      "image/png": "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\n",
      "text/plain": [
       "<Figure size 432x432 with 3 Axes>"
      ]
     },
     "metadata": {
      "needs_background": "light"
     },
     "output_type": "display_data"
    }
   ],
   "source": [
    "sns.jointplot(x=\"AGE\", y=\"MEDV\",\n",
    "\n",
    "              data=df_corr, kind=\"scatter\");"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "- 以上两图分别用计算相关性、画散点图的方式研究房屋年代与价格中位数的关系\n",
    "- 房屋年代与价格中位数呈现弱的负相关性"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "# 3. 如果发现特征之间有较强的相关性，在选择线性回归模型时应该采取什么措施。 \n",
    "有一些线性回归模型在处理较强相关的特征时并不擅长。因此可以这么处理：\n",
    "1. 使用PCA降维，将现有的特征转变成不相关的特征\n",
    "2. 增加正则项，尽量减小强相关的特征影响\n",
    "\n",
    "\n"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "# 4. 当采用带正则的模型以及采用随机梯度下降优化算法时，需要对输入（连续型）特征进行去量纲预处理。课程代码给出了用标准化（StandardScaler）的结果，请改成最小最大缩放（MinMaxScaler）去量纲 ，并重新训练最小二乘线性回归、岭回归、和Lasso模型。 \n"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 8,
   "metadata": {},
   "outputs": [],
   "source": [
    "from sklearn.preprocessing import StandardScaler, MinMaxScaler\n"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 9,
   "metadata": {},
   "outputs": [
    {
     "name": "stdout",
     "output_type": "stream",
     "text": [
      "         CRIM    ZN     INDUS  CHAS       NOX        RM       AGE       DIS  \\\n",
      "0    0.000000  0.18  0.067815   0.0  0.314815  0.577505  0.641607  0.269203   \n",
      "1    0.000236  0.00  0.242302   0.0  0.172840  0.547998  0.782698  0.348962   \n",
      "2    0.000236  0.00  0.242302   0.0  0.172840  0.694386  0.599382  0.348962   \n",
      "3    0.000293  0.00  0.063050   0.0  0.150206  0.658555  0.441813  0.448545   \n",
      "4    0.000705  0.00  0.063050   0.0  0.150206  0.687105  0.528321  0.448545   \n",
      "5    0.000264  0.00  0.063050   0.0  0.150206  0.549722  0.574665  0.448545   \n",
      "6    0.000921  0.12  0.271628   0.0  0.286008  0.469630  0.656025  0.402923   \n",
      "7    0.001554  0.12  0.271628   0.0  0.286008  0.500287  0.959835  0.438387   \n",
      "8    0.002303  0.12  0.271628   0.0  0.286008  0.396628  1.000000  0.450354   \n",
      "9    0.001840  0.12  0.271628   0.0  0.286008  0.468097  0.854789  0.496731   \n",
      "10   0.002457  0.12  0.271628   0.0  0.286008  0.539567  0.941298  0.474416   \n",
      "11   0.001249  0.12  0.271628   0.0  0.286008  0.469055  0.823893  0.463503   \n",
      "12   0.000983  0.12  0.271628   0.0  0.286008  0.446062  0.371782  0.392956   \n",
      "13   0.007007  0.00  0.281525   0.0  0.314815  0.457559  0.606591  0.325355   \n",
      "14   0.007099  0.00  0.281525   0.0  0.314815  0.485725  0.840371  0.303022   \n",
      "15   0.006981  0.00  0.281525   0.0  0.314815  0.435524  0.552008  0.306359   \n",
      "16   0.011775  0.00  0.281525   0.0  0.314815  0.454876  0.271885  0.306359   \n",
      "17   0.008743  0.00  0.281525   0.0  0.314815  0.465415  0.811535  0.284471   \n",
      "18   0.008951  0.00  0.281525   0.0  0.314815  0.363096  0.347065  0.242514   \n",
      "19   0.008087  0.00  0.281525   0.0  0.314815  0.415022  0.685891  0.242514   \n",
      "20   0.013999  0.00  0.281525   0.0  0.314815  0.384940  0.980433  0.242641   \n",
      "21   0.009506  0.00  0.281525   0.0  0.314815  0.460625  0.888774  0.262138   \n",
      "22   0.013782  0.00  0.281525   0.0  0.314815  0.494539  0.914521  0.258918   \n",
      "23   0.011039  0.00  0.281525   0.0  0.314815  0.431500  1.000000  0.269676   \n",
      "24   0.008362  0.00  0.281525   0.0  0.314815  0.452769  0.939238  0.297357   \n",
      "25   0.009376  0.00  0.281525   0.0  0.314815  0.390496  0.852729  0.302358   \n",
      "26   0.007481  0.00  0.281525   0.0  0.314815  0.431500  0.900103  0.323036   \n",
      "27   0.010672  0.00  0.281525   0.0  0.314815  0.476336  0.884655  0.302249   \n",
      "28   0.008617  0.00  0.281525   0.0  0.314815  0.562177  0.942327  0.302367   \n",
      "29   0.011196  0.00  0.281525   0.0  0.314815  0.596474  0.869207  0.282752   \n",
      "..        ...   ...       ...   ...       ...       ...       ...       ...   \n",
      "476  0.054682  0.00  0.646628   0.0  0.471193  0.560069  0.934089  0.106912   \n",
      "477  0.168788  0.00  0.646628   0.0  0.471193  0.333972  0.972194  0.088307   \n",
      "478  0.114945  0.00  0.646628   0.0  0.471193  0.502778  0.966014  0.094654   \n",
      "479  0.161036  0.00  0.646628   0.0  0.471193  0.511209  0.876416  0.074712   \n",
      "480  0.065389  0.00  0.646628   0.0  0.302469  0.513700  0.636457  0.208659   \n",
      "481  0.064088  0.00  0.646628   0.0  0.302469  0.611037  0.741504  0.200247   \n",
      "482  0.064346  0.00  0.646628   0.0  0.302469  0.670627  0.763131  0.207422   \n",
      "483  0.031607  0.00  0.646628   0.0  0.302469  0.421728  0.385170  0.269958   \n",
      "484  0.026664  0.00  0.646628   0.0  0.407407  0.442614  0.401648  0.235921   \n",
      "485  0.041220  0.00  0.646628   0.0  0.407407  0.527112  0.504634  0.260264   \n",
      "486  0.063903  0.00  0.646628   0.0  0.407407  0.489174  0.791967  0.219726   \n",
      "487  0.054281  0.00  0.646628   0.0  0.407407  0.449128  0.518023  0.183934   \n",
      "488  0.001625  0.00  1.000000   0.0  0.460905  0.362713  0.924820  0.062863   \n",
      "489  0.001990  0.00  1.000000   0.0  0.460905  0.355049  0.982492  0.056907   \n",
      "490  0.002261  0.00  1.000000   0.0  0.460905  0.293543  0.979403  0.063018   \n",
      "491  0.001117  0.00  1.000000   0.0  0.460905  0.464074  0.987642  0.067155   \n",
      "492  0.001180  0.00  1.000000   0.0  0.460905  0.464074  0.830072  0.089143   \n",
      "493  0.001877  0.00  0.338343   0.0  0.411523  0.411190  0.526262  0.113859   \n",
      "494  0.003071  0.00  0.338343   0.0  0.411523  0.453152  0.408857  0.113859   \n",
      "495  0.001941  0.00  0.338343   0.0  0.411523  0.404100  0.266735  0.151770   \n",
      "496  0.003184  0.00  0.338343   0.0  0.411523  0.350450  0.720906  0.151770   \n",
      "497  0.002945  0.00  0.338343   0.0  0.411523  0.427860  0.697219  0.160327   \n",
      "498  0.002617  0.00  0.338343   0.0  0.411523  0.470971  0.642636  0.116351   \n",
      "499  0.001928  0.00  0.338343   0.0  0.411523  0.384748  0.727085  0.115514   \n",
      "500  0.002451  0.00  0.338343   0.0  0.411523  0.472504  0.790937  0.124453   \n",
      "501  0.000633  0.00  0.420455   0.0  0.386831  0.580954  0.681771  0.122671   \n",
      "502  0.000438  0.00  0.420455   0.0  0.386831  0.490324  0.760041  0.105293   \n",
      "503  0.000612  0.00  0.420455   0.0  0.386831  0.654340  0.907312  0.094381   \n",
      "504  0.001161  0.00  0.420455   0.0  0.386831  0.619467  0.889804  0.114514   \n",
      "505  0.000462  0.00  0.420455   0.0  0.386831  0.473079  0.802266  0.125072   \n",
      "\n",
      "          TAX  PTRATIO  ...  RAD_2  RAD_3  RAD_4  RAD_5  RAD_6  RAD_7  RAD_8  \\\n",
      "0    0.208015      0.3  ...      0      0      0      0      0      0      0   \n",
      "1    0.104962      0.5  ...      1      0      0      0      0      0      0   \n",
      "2    0.104962      0.5  ...      1      0      0      0      0      0      0   \n",
      "3    0.066794      0.6  ...      0      1      0      0      0      0      0   \n",
      "4    0.066794      0.6  ...      0      1      0      0      0      0      0   \n",
      "5    0.066794      0.6  ...      0      1      0      0      0      0      0   \n",
      "6    0.236641      0.3  ...      0      0      0      1      0      0      0   \n",
      "7    0.236641      0.3  ...      0      0      0      1      0      0      0   \n",
      "8    0.236641      0.3  ...      0      0      0      1      0      0      0   \n",
      "9    0.236641      0.3  ...      0      0      0      1      0      0      0   \n",
      "10   0.236641      0.3  ...      0      0      0      1      0      0      0   \n",
      "11   0.236641      0.3  ...      0      0      0      1      0      0      0   \n",
      "12   0.236641      0.3  ...      0      0      0      1      0      0      0   \n",
      "13   0.229008      0.9  ...      0      0      1      0      0      0      0   \n",
      "14   0.229008      0.9  ...      0      0      1      0      0      0      0   \n",
      "15   0.229008      0.9  ...      0      0      1      0      0      0      0   \n",
      "16   0.229008      0.9  ...      0      0      1      0      0      0      0   \n",
      "17   0.229008      0.9  ...      0      0      1      0      0      0      0   \n",
      "18   0.229008      0.9  ...      0      0      1      0      0      0      0   \n",
      "19   0.229008      0.9  ...      0      0      1      0      0      0      0   \n",
      "20   0.229008      0.9  ...      0      0      1      0      0      0      0   \n",
      "21   0.229008      0.9  ...      0      0      1      0      0      0      0   \n",
      "22   0.229008      0.9  ...      0      0      1      0      0      0      0   \n",
      "23   0.229008      0.9  ...      0      0      1      0      0      0      0   \n",
      "24   0.229008      0.9  ...      0      0      1      0      0      0      0   \n",
      "25   0.229008      0.9  ...      0      0      1      0      0      0      0   \n",
      "26   0.229008      0.9  ...      0      0      1      0      0      0      0   \n",
      "27   0.229008      0.9  ...      0      0      1      0      0      0      0   \n",
      "28   0.229008      0.9  ...      0      0      1      0      0      0      0   \n",
      "29   0.229008      0.9  ...      0      0      1      0      0      0      0   \n",
      "..        ...      ...  ...    ...    ...    ...    ...    ...    ...    ...   \n",
      "476  0.914122      0.8  ...      0      0      0      0      0      0      0   \n",
      "477  0.914122      0.8  ...      0      0      0      0      0      0      0   \n",
      "478  0.914122      0.8  ...      0      0      0      0      0      0      0   \n",
      "479  0.914122      0.8  ...      0      0      0      0      0      0      0   \n",
      "480  0.914122      0.8  ...      0      0      0      0      0      0      0   \n",
      "481  0.914122      0.8  ...      0      0      0      0      0      0      0   \n",
      "482  0.914122      0.8  ...      0      0      0      0      0      0      0   \n",
      "483  0.914122      0.8  ...      0      0      0      0      0      0      0   \n",
      "484  0.914122      0.8  ...      0      0      0      0      0      0      0   \n",
      "485  0.914122      0.8  ...      0      0      0      0      0      0      0   \n",
      "486  0.914122      0.8  ...      0      0      0      0      0      0      0   \n",
      "487  0.914122      0.8  ...      0      0      0      0      0      0      0   \n",
      "488  1.000000      0.8  ...      0      0      1      0      0      0      0   \n",
      "489  1.000000      0.8  ...      0      0      1      0      0      0      0   \n",
      "490  1.000000      0.8  ...      0      0      1      0      0      0      0   \n",
      "491  1.000000      0.8  ...      0      0      1      0      0      0      0   \n",
      "492  1.000000      0.8  ...      0      0      1      0      0      0      0   \n",
      "493  0.389313      0.7  ...      0      0      0      0      1      0      0   \n",
      "494  0.389313      0.7  ...      0      0      0      0      1      0      0   \n",
      "495  0.389313      0.7  ...      0      0      0      0      1      0      0   \n",
      "496  0.389313      0.7  ...      0      0      0      0      1      0      0   \n",
      "497  0.389313      0.7  ...      0      0      0      0      1      0      0   \n",
      "498  0.389313      0.7  ...      0      0      0      0      1      0      0   \n",
      "499  0.389313      0.7  ...      0      0      0      0      1      0      0   \n",
      "500  0.389313      0.7  ...      0      0      0      0      1      0      0   \n",
      "501  0.164122      0.9  ...      0      0      0      0      0      0      0   \n",
      "502  0.164122      0.9  ...      0      0      0      0      0      0      0   \n",
      "503  0.164122      0.9  ...      0      0      0      0      0      0      0   \n",
      "504  0.164122      0.9  ...      0      0      0      0      0      0      0   \n",
      "505  0.164122      0.9  ...      0      0      0      0      0      0      0   \n",
      "\n",
      "     RAD_24      MEDV  log_MEDV  \n",
      "0         0  0.422222  0.666856  \n",
      "1         0  0.368889  0.619696  \n",
      "2         0  0.660000  0.833335  \n",
      "3         0  0.631111  0.816001  \n",
      "4         0  0.693333  0.852567  \n",
      "5         0  0.526667  0.747354  \n",
      "6         0  0.397778  0.645830  \n",
      "7         0  0.491111  0.721478  \n",
      "8         0  0.255556  0.500191  \n",
      "9         0  0.308889  0.560244  \n",
      "10        0  0.222222  0.458317  \n",
      "11        0  0.308889  0.560244  \n",
      "12        0  0.371111  0.621759  \n",
      "13        0  0.342222  0.594202  \n",
      "14        0  0.293333  0.543512  \n",
      "15        0  0.331111  0.583155  \n",
      "16        0  0.402222  0.649724  \n",
      "17        0  0.277778  0.526157  \n",
      "18        0  0.337778  0.589814  \n",
      "19        0  0.293333  0.543512  \n",
      "20        0  0.191111  0.415530  \n",
      "21        0  0.324444  0.576399  \n",
      "22        0  0.226667  0.464122  \n",
      "23        0  0.211111  0.443482  \n",
      "24        0  0.235556  0.475520  \n",
      "25        0  0.197778  0.425034  \n",
      "26        0  0.257778  0.502853  \n",
      "27        0  0.217778  0.452440  \n",
      "28        0  0.297778  0.548354  \n",
      "29        0  0.355556  0.607123  \n",
      "..      ...       ...       ...  \n",
      "476       1  0.260000  0.505501  \n",
      "477       1  0.155556  0.361293  \n",
      "478       1  0.213333  0.446487  \n",
      "479       1  0.364444  0.615542  \n",
      "480       1  0.400000  0.647781  \n",
      "481       1  0.415556  0.661215  \n",
      "482       1  0.444444  0.685183  \n",
      "483       1  0.373333  0.623813  \n",
      "484       1  0.346667  0.598549  \n",
      "485       1  0.360000  0.611352  \n",
      "486       1  0.313333  0.564917  \n",
      "487       1  0.346667  0.598549  \n",
      "488       0  0.226667  0.464122  \n",
      "489       0  0.044444  0.134427  \n",
      "490       0  0.068889  0.194627  \n",
      "491       0  0.191111  0.415530  \n",
      "492       0  0.335556  0.587605  \n",
      "493       0  0.373333  0.623813  \n",
      "494       0  0.433333  0.676109  \n",
      "495       0  0.402222  0.649724  \n",
      "496       0  0.326667  0.578662  \n",
      "497       0  0.295556  0.545939  \n",
      "498       0  0.360000  0.611352  \n",
      "499       0  0.277778  0.526157  \n",
      "500       0  0.262222  0.508133  \n",
      "501       0  0.386667  0.635951  \n",
      "502       0  0.346667  0.598549  \n",
      "503       0  0.420000  0.664983  \n",
      "504       0  0.377778  0.627894  \n",
      "505       0  0.153333  0.357684  \n",
      "\n",
      "[506 rows x 23 columns]\n"
     ]
    }
   ],
   "source": [
    "#使用最大最小缩放去量纲 \n",
    "df = pd.read_csv(\"boston_housing.csv\")\n",
    "\n",
    "y = df['MEDV']\n",
    "X = df.drop('MEDV', axis=1)\n",
    "log_y = np.log1p(y)\n",
    "\n",
    "X[\"RAD\"].astype(\"object\")\n",
    "X_cat = X['RAD']\n",
    "X_cat = pd.get_dummies(X_cat, prefix=\"RAD\")\n",
    "\n",
    "X = X.drop(\"RAD\", axis=1)\n",
    "fe_names = X.columns\n",
    "ss_X = MinMaxScaler()\n",
    "ss_y = MinMaxScaler()\n",
    "ss_log_y = MinMaxScaler()\n",
    "\n",
    "X = ss_X.fit_transform(X)\n",
    "y = ss_y.fit_transform(y.values.reshape(-1,1))\n",
    "log_y = ss_y.fit_transform(log_y.values.reshape(-1,1))\n",
    "\n",
    "fe_data = pd.DataFrame(data=X, columns=fe_names, index=df.index)\n",
    "fe_data = pd.concat([fe_data, X_cat], axis=1, ignore_index=False)\n",
    "fe_data['MEDV'] = y\n",
    "fe_data['log_MEDV'] = log_y\n",
    "print(fe_data)\n",
    "\n",
    "fe_data.to_csv('FE_boston_housing_minmax.csv', index=False)\n"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 10,
   "metadata": {},
   "outputs": [
    {
     "name": "stdout",
     "output_type": "stream",
     "text": [
      "(404, 21)\n",
      "<bound method DataFrame.info of          CRIM    ZN     INDUS  CHAS       NOX        RM       AGE       DIS  \\\n",
      "0    0.000000  0.18  0.067815   0.0  0.314815  0.577505  0.641607  0.269203   \n",
      "1    0.000236  0.00  0.242302   0.0  0.172840  0.547998  0.782698  0.348962   \n",
      "2    0.000236  0.00  0.242302   0.0  0.172840  0.694386  0.599382  0.348962   \n",
      "3    0.000293  0.00  0.063050   0.0  0.150206  0.658555  0.441813  0.448545   \n",
      "4    0.000705  0.00  0.063050   0.0  0.150206  0.687105  0.528321  0.448545   \n",
      "5    0.000264  0.00  0.063050   0.0  0.150206  0.549722  0.574665  0.448545   \n",
      "6    0.000921  0.12  0.271628   0.0  0.286008  0.469630  0.656025  0.402923   \n",
      "7    0.001554  0.12  0.271628   0.0  0.286008  0.500287  0.959835  0.438387   \n",
      "8    0.002303  0.12  0.271628   0.0  0.286008  0.396628  1.000000  0.450354   \n",
      "9    0.001840  0.12  0.271628   0.0  0.286008  0.468097  0.854789  0.496731   \n",
      "10   0.002457  0.12  0.271628   0.0  0.286008  0.539567  0.941298  0.474416   \n",
      "11   0.001249  0.12  0.271628   0.0  0.286008  0.469055  0.823893  0.463503   \n",
      "12   0.000983  0.12  0.271628   0.0  0.286008  0.446062  0.371782  0.392956   \n",
      "13   0.007007  0.00  0.281525   0.0  0.314815  0.457559  0.606591  0.325355   \n",
      "14   0.007099  0.00  0.281525   0.0  0.314815  0.485725  0.840371  0.303022   \n",
      "15   0.006981  0.00  0.281525   0.0  0.314815  0.435524  0.552008  0.306359   \n",
      "16   0.011775  0.00  0.281525   0.0  0.314815  0.454876  0.271885  0.306359   \n",
      "17   0.008743  0.00  0.281525   0.0  0.314815  0.465415  0.811535  0.284471   \n",
      "18   0.008951  0.00  0.281525   0.0  0.314815  0.363096  0.347065  0.242514   \n",
      "19   0.008087  0.00  0.281525   0.0  0.314815  0.415022  0.685891  0.242514   \n",
      "20   0.013999  0.00  0.281525   0.0  0.314815  0.384940  0.980433  0.242641   \n",
      "21   0.009506  0.00  0.281525   0.0  0.314815  0.460625  0.888774  0.262138   \n",
      "22   0.013782  0.00  0.281525   0.0  0.314815  0.494539  0.914521  0.258918   \n",
      "23   0.011039  0.00  0.281525   0.0  0.314815  0.431500  1.000000  0.269676   \n",
      "24   0.008362  0.00  0.281525   0.0  0.314815  0.452769  0.939238  0.297357   \n",
      "25   0.009376  0.00  0.281525   0.0  0.314815  0.390496  0.852729  0.302358   \n",
      "26   0.007481  0.00  0.281525   0.0  0.314815  0.431500  0.900103  0.323036   \n",
      "27   0.010672  0.00  0.281525   0.0  0.314815  0.476336  0.884655  0.302249   \n",
      "28   0.008617  0.00  0.281525   0.0  0.314815  0.562177  0.942327  0.302367   \n",
      "29   0.011196  0.00  0.281525   0.0  0.314815  0.596474  0.869207  0.282752   \n",
      "..        ...   ...       ...   ...       ...       ...       ...       ...   \n",
      "476  0.054682  0.00  0.646628   0.0  0.471193  0.560069  0.934089  0.106912   \n",
      "477  0.168788  0.00  0.646628   0.0  0.471193  0.333972  0.972194  0.088307   \n",
      "478  0.114945  0.00  0.646628   0.0  0.471193  0.502778  0.966014  0.094654   \n",
      "479  0.161036  0.00  0.646628   0.0  0.471193  0.511209  0.876416  0.074712   \n",
      "480  0.065389  0.00  0.646628   0.0  0.302469  0.513700  0.636457  0.208659   \n",
      "481  0.064088  0.00  0.646628   0.0  0.302469  0.611037  0.741504  0.200247   \n",
      "482  0.064346  0.00  0.646628   0.0  0.302469  0.670627  0.763131  0.207422   \n",
      "483  0.031607  0.00  0.646628   0.0  0.302469  0.421728  0.385170  0.269958   \n",
      "484  0.026664  0.00  0.646628   0.0  0.407407  0.442614  0.401648  0.235921   \n",
      "485  0.041220  0.00  0.646628   0.0  0.407407  0.527112  0.504634  0.260264   \n",
      "486  0.063903  0.00  0.646628   0.0  0.407407  0.489174  0.791967  0.219726   \n",
      "487  0.054281  0.00  0.646628   0.0  0.407407  0.449128  0.518023  0.183934   \n",
      "488  0.001625  0.00  1.000000   0.0  0.460905  0.362713  0.924820  0.062863   \n",
      "489  0.001990  0.00  1.000000   0.0  0.460905  0.355049  0.982492  0.056907   \n",
      "490  0.002261  0.00  1.000000   0.0  0.460905  0.293543  0.979403  0.063018   \n",
      "491  0.001117  0.00  1.000000   0.0  0.460905  0.464074  0.987642  0.067155   \n",
      "492  0.001180  0.00  1.000000   0.0  0.460905  0.464074  0.830072  0.089143   \n",
      "493  0.001877  0.00  0.338343   0.0  0.411523  0.411190  0.526262  0.113859   \n",
      "494  0.003071  0.00  0.338343   0.0  0.411523  0.453152  0.408857  0.113859   \n",
      "495  0.001941  0.00  0.338343   0.0  0.411523  0.404100  0.266735  0.151770   \n",
      "496  0.003184  0.00  0.338343   0.0  0.411523  0.350450  0.720906  0.151770   \n",
      "497  0.002945  0.00  0.338343   0.0  0.411523  0.427860  0.697219  0.160327   \n",
      "498  0.002617  0.00  0.338343   0.0  0.411523  0.470971  0.642636  0.116351   \n",
      "499  0.001928  0.00  0.338343   0.0  0.411523  0.384748  0.727085  0.115514   \n",
      "500  0.002451  0.00  0.338343   0.0  0.411523  0.472504  0.790937  0.124453   \n",
      "501  0.000633  0.00  0.420455   0.0  0.386831  0.580954  0.681771  0.122671   \n",
      "502  0.000438  0.00  0.420455   0.0  0.386831  0.490324  0.760041  0.105293   \n",
      "503  0.000612  0.00  0.420455   0.0  0.386831  0.654340  0.907312  0.094381   \n",
      "504  0.001161  0.00  0.420455   0.0  0.386831  0.619467  0.889804  0.114514   \n",
      "505  0.000462  0.00  0.420455   0.0  0.386831  0.473079  0.802266  0.125072   \n",
      "\n",
      "          TAX  PTRATIO  ...  RAD_2  RAD_3  RAD_4  RAD_5  RAD_6  RAD_7  RAD_8  \\\n",
      "0    0.208015      0.3  ...      0      0      0      0      0      0      0   \n",
      "1    0.104962      0.5  ...      1      0      0      0      0      0      0   \n",
      "2    0.104962      0.5  ...      1      0      0      0      0      0      0   \n",
      "3    0.066794      0.6  ...      0      1      0      0      0      0      0   \n",
      "4    0.066794      0.6  ...      0      1      0      0      0      0      0   \n",
      "5    0.066794      0.6  ...      0      1      0      0      0      0      0   \n",
      "6    0.236641      0.3  ...      0      0      0      1      0      0      0   \n",
      "7    0.236641      0.3  ...      0      0      0      1      0      0      0   \n",
      "8    0.236641      0.3  ...      0      0      0      1      0      0      0   \n",
      "9    0.236641      0.3  ...      0      0      0      1      0      0      0   \n",
      "10   0.236641      0.3  ...      0      0      0      1      0      0      0   \n",
      "11   0.236641      0.3  ...      0      0      0      1      0      0      0   \n",
      "12   0.236641      0.3  ...      0      0      0      1      0      0      0   \n",
      "13   0.229008      0.9  ...      0      0      1      0      0      0      0   \n",
      "14   0.229008      0.9  ...      0      0      1      0      0      0      0   \n",
      "15   0.229008      0.9  ...      0      0      1      0      0      0      0   \n",
      "16   0.229008      0.9  ...      0      0      1      0      0      0      0   \n",
      "17   0.229008      0.9  ...      0      0      1      0      0      0      0   \n",
      "18   0.229008      0.9  ...      0      0      1      0      0      0      0   \n",
      "19   0.229008      0.9  ...      0      0      1      0      0      0      0   \n",
      "20   0.229008      0.9  ...      0      0      1      0      0      0      0   \n",
      "21   0.229008      0.9  ...      0      0      1      0      0      0      0   \n",
      "22   0.229008      0.9  ...      0      0      1      0      0      0      0   \n",
      "23   0.229008      0.9  ...      0      0      1      0      0      0      0   \n",
      "24   0.229008      0.9  ...      0      0      1      0      0      0      0   \n",
      "25   0.229008      0.9  ...      0      0      1      0      0      0      0   \n",
      "26   0.229008      0.9  ...      0      0      1      0      0      0      0   \n",
      "27   0.229008      0.9  ...      0      0      1      0      0      0      0   \n",
      "28   0.229008      0.9  ...      0      0      1      0      0      0      0   \n",
      "29   0.229008      0.9  ...      0      0      1      0      0      0      0   \n",
      "..        ...      ...  ...    ...    ...    ...    ...    ...    ...    ...   \n",
      "476  0.914122      0.8  ...      0      0      0      0      0      0      0   \n",
      "477  0.914122      0.8  ...      0      0      0      0      0      0      0   \n",
      "478  0.914122      0.8  ...      0      0      0      0      0      0      0   \n",
      "479  0.914122      0.8  ...      0      0      0      0      0      0      0   \n",
      "480  0.914122      0.8  ...      0      0      0      0      0      0      0   \n",
      "481  0.914122      0.8  ...      0      0      0      0      0      0      0   \n",
      "482  0.914122      0.8  ...      0      0      0      0      0      0      0   \n",
      "483  0.914122      0.8  ...      0      0      0      0      0      0      0   \n",
      "484  0.914122      0.8  ...      0      0      0      0      0      0      0   \n",
      "485  0.914122      0.8  ...      0      0      0      0      0      0      0   \n",
      "486  0.914122      0.8  ...      0      0      0      0      0      0      0   \n",
      "487  0.914122      0.8  ...      0      0      0      0      0      0      0   \n",
      "488  1.000000      0.8  ...      0      0      1      0      0      0      0   \n",
      "489  1.000000      0.8  ...      0      0      1      0      0      0      0   \n",
      "490  1.000000      0.8  ...      0      0      1      0      0      0      0   \n",
      "491  1.000000      0.8  ...      0      0      1      0      0      0      0   \n",
      "492  1.000000      0.8  ...      0      0      1      0      0      0      0   \n",
      "493  0.389313      0.7  ...      0      0      0      0      1      0      0   \n",
      "494  0.389313      0.7  ...      0      0      0      0      1      0      0   \n",
      "495  0.389313      0.7  ...      0      0      0      0      1      0      0   \n",
      "496  0.389313      0.7  ...      0      0      0      0      1      0      0   \n",
      "497  0.389313      0.7  ...      0      0      0      0      1      0      0   \n",
      "498  0.389313      0.7  ...      0      0      0      0      1      0      0   \n",
      "499  0.389313      0.7  ...      0      0      0      0      1      0      0   \n",
      "500  0.389313      0.7  ...      0      0      0      0      1      0      0   \n",
      "501  0.164122      0.9  ...      0      0      0      0      0      0      0   \n",
      "502  0.164122      0.9  ...      0      0      0      0      0      0      0   \n",
      "503  0.164122      0.9  ...      0      0      0      0      0      0      0   \n",
      "504  0.164122      0.9  ...      0      0      0      0      0      0      0   \n",
      "505  0.164122      0.9  ...      0      0      0      0      0      0      0   \n",
      "\n",
      "     RAD_24      MEDV  log_MEDV  \n",
      "0         0  0.422222  0.666856  \n",
      "1         0  0.368889  0.619696  \n",
      "2         0  0.660000  0.833335  \n",
      "3         0  0.631111  0.816001  \n",
      "4         0  0.693333  0.852567  \n",
      "5         0  0.526667  0.747354  \n",
      "6         0  0.397778  0.645830  \n",
      "7         0  0.491111  0.721478  \n",
      "8         0  0.255556  0.500191  \n",
      "9         0  0.308889  0.560244  \n",
      "10        0  0.222222  0.458317  \n",
      "11        0  0.308889  0.560244  \n",
      "12        0  0.371111  0.621759  \n",
      "13        0  0.342222  0.594202  \n",
      "14        0  0.293333  0.543512  \n",
      "15        0  0.331111  0.583155  \n",
      "16        0  0.402222  0.649724  \n",
      "17        0  0.277778  0.526157  \n",
      "18        0  0.337778  0.589814  \n",
      "19        0  0.293333  0.543512  \n",
      "20        0  0.191111  0.415530  \n",
      "21        0  0.324444  0.576399  \n",
      "22        0  0.226667  0.464122  \n",
      "23        0  0.211111  0.443482  \n",
      "24        0  0.235556  0.475520  \n",
      "25        0  0.197778  0.425034  \n",
      "26        0  0.257778  0.502853  \n",
      "27        0  0.217778  0.452440  \n",
      "28        0  0.297778  0.548354  \n",
      "29        0  0.355556  0.607123  \n",
      "..      ...       ...       ...  \n",
      "476       1  0.260000  0.505501  \n",
      "477       1  0.155556  0.361293  \n",
      "478       1  0.213333  0.446487  \n",
      "479       1  0.364444  0.615542  \n",
      "480       1  0.400000  0.647781  \n",
      "481       1  0.415556  0.661215  \n",
      "482       1  0.444444  0.685183  \n",
      "483       1  0.373333  0.623813  \n",
      "484       1  0.346667  0.598549  \n",
      "485       1  0.360000  0.611352  \n",
      "486       1  0.313333  0.564917  \n",
      "487       1  0.346667  0.598549  \n",
      "488       0  0.226667  0.464122  \n",
      "489       0  0.044444  0.134427  \n",
      "490       0  0.068889  0.194627  \n",
      "491       0  0.191111  0.415530  \n",
      "492       0  0.335556  0.587605  \n",
      "493       0  0.373333  0.623813  \n",
      "494       0  0.433333  0.676109  \n",
      "495       0  0.402222  0.649724  \n",
      "496       0  0.326667  0.578662  \n",
      "497       0  0.295556  0.545939  \n",
      "498       0  0.360000  0.611352  \n",
      "499       0  0.277778  0.526157  \n",
      "500       0  0.262222  0.508133  \n",
      "501       0  0.386667  0.635951  \n",
      "502       0  0.346667  0.598549  \n",
      "503       0  0.420000  0.664983  \n",
      "504       0  0.377778  0.627894  \n",
      "505       0  0.153333  0.357684  \n",
      "\n",
      "[506 rows x 23 columns]>\n"
     ]
    }
   ],
   "source": [
    "\n",
    "from sklearn.model_selection import train_test_split\n",
    "from sklearn.metrics import r2_score  #评价回归预测模型的性能\n",
    "from sklearn.linear_model import LinearRegression\n",
    "\n",
    "\n",
    "# 读取去量纲后的数据\n",
    "df = pd.read_csv(\"FE_boston_housing_minmax.csv\")\n",
    "y = df[\"MEDV\"]\n",
    "X = df.drop([\"MEDV\", \"log_MEDV\"], axis=1)\n",
    "feat_names = X.columns\n",
    "\n",
    "X_train, X_test, y_train, y_test = train_test_split(X,y,random_state=2,test_size=0.2)\n",
    "print(X_train.shape)\n",
    "print(df.info)"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 11,
   "metadata": {},
   "outputs": [
    {
     "name": "stdout",
     "output_type": "stream",
     "text": [
      "    columns      coef\n",
      "5        RM  0.405588\n",
      "1        ZN  0.120974\n",
      "10        B  0.104021\n",
      "20   RAD_24  0.096493\n",
      "3      CHAS  0.066677\n",
      "18    RAD_7  0.059380\n",
      "19    RAD_8  0.029040\n",
      "14    RAD_3  0.022602\n",
      "6       AGE  0.020753\n",
      "2     INDUS -0.007681\n",
      "16    RAD_5 -0.017568\n",
      "15    RAD_4 -0.021756\n",
      "13    RAD_2 -0.036908\n",
      "17    RAD_6 -0.054210\n",
      "12    RAD_1 -0.077072\n",
      "8       TAX -0.096294\n",
      "4       NOX -0.168815\n",
      "0      CRIM -0.217776\n",
      "9   PTRATIO -0.219940\n",
      "7       DIS -0.376482\n",
      "11    LSTAT -0.455804\n",
      "The r2 score of LinearRegression on test is 0.779950\n",
      "The r2 score of LinearRegression on train is 0.737147\n"
     ]
    },
    {
     "data": {
      "image/png": "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a9fy6quv9nYp6iJDhgxh7NixNDQ01L2PoSxJBVi7di0HHHAA48aNI6Kr/jiYektmsnnzZtauXcv48ePr3s/L15JUgFdffZWDDjrIQO4jIoKDDjqow1c+DGVJKoSB3Ld05vM0lCVJKoT3lCWpQE1NPX+8gQMHctxxx7Ft2zbGjx/P9773PQ488MAOn+ujH/0oV1xxBRMmTNhl/S233MKyZcv45je/2eFjAgwdOpQtW7bUte306dO5/vrraWxs3Llu2bJl3Hrrrdxwww2dOn9PsKcsSQLgDW94AytWrODRRx9lxIgR3HjjjZ06zk033bRbIJegsbGx2wN5+/bte7W/oSxJ2s20adNYt27dzuXrrruOE088keOPP56rr74agJdffpmZM2cyceJEjj32WBYsWADUeqk7plT+7ne/y9FHH82pp57KAw88sPN4F110EQsXLty5PHToUAC2bNnCjBkzOOGEEzjuuONYtGjRbrWtX7+eU045hUmTJnHsscfys5/9rK73tGTJEs4880wAmpqauPjii5k+fTpHHHHELmF92223MWXKFCZNmsTHPvaxnUF76aWX0tjYyDHHHLOzDaA2hfQ111zDu971Lu666666ammLl68lSbvYvn07ixcvZs6cOQDce++9rFq1il/84hdkJmeddRZLly5l06ZNHHbYYfzoRz8C4IUXXtjlOOvXr+fqq69m+fLlDB8+nHe/+91Mnjx5j+ceMmQId999N8OGDeOZZ55h6tSpnHXWWbsMmvr+97/P6aefzuc//3m2b9/OK6+80qn3+cQTT3Dffffx0ksv8da3vpVLL72U1atXs2DBAh544AEaGhq47LLLuP3227nwwgv58pe/zIgRI9i+fTszZszgkUce4fjjj99Z9/3339+pOpozlCVJAPzxj39k0qRJPPXUU7zjHe/gtNNOA2qhfO+99+4M1C1btrBq1SpOPvlkrrzySj7zmc9w5plncvLJJ+9yvIceeojp06czcmTtDyKde+65/Pa3v91jDZnJ5z73OZYuXcqAAQNYt24dGzZs4NBDD925zYknnsjFF1/M1q1bOfvss5k0aVKn3u/MmTMZPHgwgwcPZtSoUWzYsIHFixezfPlyTjzxxJ1tMmrUKADuvPNO5s2bx7Zt21i/fj2PP/74zlA+99xzO1VDS16+liQBf76nvGbNGl577bWd95Qz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\n",
      "text/plain": [
       "<Figure size 504x360 with 1 Axes>"
      ]
     },
     "metadata": {
      "needs_background": "light"
     },
     "output_type": "display_data"
    },
    {
     "data": {
      "image/png": "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\n",
      "text/plain": [
       "<Figure size 288x216 with 1 Axes>"
      ]
     },
     "metadata": {
      "needs_background": "light"
     },
     "output_type": "display_data"
    }
   ],
   "source": [
    "#最小二乘线性回归\n",
    "# 1. 线性回归\n",
    "lr = LinearRegression()\n",
    "lr.fit(X_train, y_train)\n",
    "y_test_pred_lr = lr.predict(X_test)\n",
    "y_train_pred_lr = lr.predict(X_train)\n",
    "# 权重系数\n",
    "fs = pd.DataFrame({\"columns\":list(feat_names), \"coef\": list((lr.coef_.T))})\n",
    "print(fs.sort_values(by=['coef'], ascending=False))\n",
    "# r2_score 评估模型性能\n",
    "print('The r2 score of LinearRegression on test is %.6f'  % r2_score(y_test, y_test_pred_lr))\n",
    "print('The r2 score of LinearRegression on train is %.6f'  % r2_score(y_train, y_train_pred_lr))\n",
    "# 观察残差分布，看是否符合：噪声为0均值的高斯分布\n",
    "f,ax = plt.subplots(figsize=(7,5))\n",
    "f.tight_layout()\n",
    "ax.hist(y_train-y_train_pred_lr, bins=40, label='Residuals Linear', color='b', alpha=0.5)\n",
    "ax.set_title(\"Histogram of Resicuals\")\n",
    "ax.legend(loc='best')\n",
    "plt.show()\n",
    "# 观察预测值与真值的散点图\n",
    "# plt.clf\n",
    "plt.figure(figsize=(4,3))\n",
    "plt.scatter(y_train, y_train_pred_lr)\n",
    "plt.plot([0,1],[0,1], '--k')\n",
    "plt.axis('tight')\n",
    "plt.xlabel('true price')\n",
    "plt.ylabel('predicted price')\n",
    "plt.tight_layout()\n",
    "plt.show()\n"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "- 最小二乘线性回归的r2_score值在0.7以上\n",
    "- 从真实值-预测值散点图来看，有部分预测值在0以下，小于最小值0\n",
    "- 真实值最高（等于1）的样本，其预测值偏离较大"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 16,
   "metadata": {},
   "outputs": [
    {
     "name": "stdout",
     "output_type": "stream",
     "text": [
      "The r2 score of RidgeCV on test is 0.780414\n",
      "The r2 score of RidgeCV on train is 0.737087\n",
      "[-1. -1. -1.]\n"
     ]
    },
    {
     "data": {
      "image/png": "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\n",
      "text/plain": [
       "<Figure size 432x288 with 1 Axes>"
      ]
     },
     "metadata": {
      "needs_background": "light"
     },
     "output_type": "display_data"
    },
    {
     "name": "stdout",
     "output_type": "stream",
     "text": [
      "alpha is  0.1\n"
     ]
    }
   ],
   "source": [
    "\n",
    "# 2.正则化的线性回归\n",
    "from sklearn.linear_model import RidgeCV\n",
    "# 超参数范围\n",
    "alphas = [0.01, 0.1, 1,10,100]\n",
    "# 生成ridge实例\n",
    "ridge = RidgeCV(alphas=alphas, store_cv_values=True)\n",
    "# 模型训练\n",
    "ridge.fit(X_train, y_train)\n",
    "# 预测\n",
    "y_test_pred_ridge = ridge.predict(X_test)\n",
    "y_train_pred_ridge = ridge.predict(X_train)\n",
    "# r2_score 评估模型性能\n",
    "print('The r2 score of RidgeCV on test is %.6f'  % r2_score(y_test, y_test_pred_ridge))\n",
    "print('The r2 score of RidgeCV on train is %.6f'  % r2_score(y_train, y_train_pred_ridge))\n",
    "\n",
    "# 可视化\n",
    "# print(ridge.cv_values_)\n",
    "mse_mean = np.mean(ridge.cv_values_, axis=0)\n",
    "print(np.log10(ridge.alpha_)*np.ones(3))\n",
    "plt.plot(np.log10(alphas), mse_mean.reshape(len(alphas), 1))\n",
    "plt.xlabel('log(alpha)')\n",
    "plt.ylabel('mse')\n",
    "plt.show()\n",
    "print('alpha is ', ridge.alpha_)\n",
    "\n"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 19,
   "metadata": {},
   "outputs": [
    {
     "data": {
      "image/png": "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\n",
      "text/plain": [
       "<Figure size 288x216 with 1 Axes>"
      ]
     },
     "metadata": {
      "needs_background": "light"
     },
     "output_type": "display_data"
    }
   ],
   "source": [
    "\n",
    "# 观察预测值与真值的散点图\n",
    "plt.figure(figsize=(4,3))\n",
    "plt.scatter(y_train, y_train_pred_ridge)\n",
    "plt.plot([0,1],[0,1], '--k')\n",
    "plt.axis('tight')\n",
    "plt.xlabel('true price')\n",
    "plt.ylabel('predicted price')\n",
    "plt.tight_layout()\n",
    "plt.show()\n"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 22,
   "metadata": {},
   "outputs": [
    {
     "name": "stdout",
     "output_type": "stream",
     "text": [
      "[ 0.43643079  0.38965195  0.28232729  0.56318886  0.17190934  0.1617611\n",
      "  0.34502695  0.17510393  0.18918382  0.40574122  0.25749818  0.15683782\n",
      "  0.61009907  0.4541242   0.60737817  0.31608848  0.41770691  0.39312842\n",
      "  0.525252    0.32326446  0.63946944 -0.02336799  0.78577181  0.40676002\n",
      "  0.31532142  0.40861484  0.37437026  0.4873716   0.3814465   0.64749222\n",
      "  0.42442645  0.06839473  0.27921208  0.10699225  0.33890355  0.18107422\n",
      "  0.29938252  0.46049809  0.15629502  0.28720559  0.42144101  0.52073154\n",
      "  0.27097359  0.41754498  0.17905969  0.12782066  0.49034217  0.29999348\n",
      "  0.84580892  0.25285586  0.37953869  0.63676353  0.3518143   0.3161211\n",
      "  0.32450473  0.34951745  0.47643436  0.66791763  0.43126704  0.66148164\n",
      "  0.33894446  0.77879403  0.24551427  0.0826347   0.36658025  0.19141209\n",
      "  0.51053227  0.28353696  0.47632079  0.74525915  0.70476428  0.73033792\n",
      "  0.38252282  0.56804332  0.48965857  0.83152748  0.32292278  0.3985003\n",
      "  0.26840026  0.49675049  0.63432975  0.45456436  0.48766854  0.40760648\n",
      "  0.74874371  0.35140209  0.62920444  0.67245271 -0.21615867  0.31384407\n",
      "  0.27171937  0.14737252  0.42463251  0.78521071  0.69468946  0.21237388\n",
      "  0.64164158  0.30487087  0.15132803  0.57491532  0.39370111  0.40649767\n",
      "  0.30281718  0.28711837  0.40936293  0.48451478  0.27820426  0.58585033\n",
      "  0.45490319  0.1941866   0.32624426  0.31809381  0.30971759  0.40029061\n",
      "  0.44351198  0.24323383  0.30942067  0.31169078  0.10240348  0.66371066\n",
      "  0.18475535  0.64361606  0.65413406  0.31054886  0.31825962 -0.01742892\n",
      "  0.13890436  0.10828884  0.31212753  0.12471669  0.47148444  0.2423827\n",
      "  0.32816902  0.72661925  0.49069899  0.36445228  0.52942438  0.51169181\n",
      "  0.54711359  0.55658302  0.30001836  0.17729412  0.84426232  0.39283408\n",
      "  0.22929     0.17270989  0.72279848  0.61754885  0.18787571  0.3360417\n",
      "  0.45307234  0.63540194  0.5206707   0.03955158  0.44784116  0.44488384\n",
      "  0.50546501 -0.08741936  0.62466577  0.67989088  0.20751218  0.34248823\n",
      "  0.54797322  0.5673494   0.62954943  0.45101887  0.26766767  0.36070826\n",
      "  0.29979888  0.55189787  0.46459597  0.38025001  0.31907221  0.14479733\n",
      "  0.45589656  0.3162351   0.37208224  0.19961191  0.5831827   0.79179914\n",
      "  0.34718359  0.4145729   0.44902648  0.28199972  0.34697851  0.50856289\n",
      "  0.44504577  0.42495196  0.51632778  0.32614265  0.69448814  0.21434793\n",
      "  0.28408791  0.42469083  0.31533879  0.29652737  0.46846529  0.24055327\n",
      "  0.49830209  0.4436928   0.32338452  0.65640878  0.1834506   0.39010013\n",
      "  0.24242543  0.71194041  0.55736505  0.38627426  0.48922852  0.31516688\n",
      "  0.27114478  0.27206567  0.40571007  0.44934591  0.26314055  0.23837465\n",
      "  0.30821891  0.37563144  0.26203351  0.30179671  0.35337495  0.42674425\n",
      "  0.19974637  0.16047698  0.36014202  0.37344888  0.13403183  0.54580691\n",
      "  0.619311    0.45857227  0.16193412  0.31505084  0.72612268  0.14176762\n",
      "  0.48776681  0.34724024  0.61801728  0.84112419  0.25374258  0.26126226\n",
      "  0.03337302  0.36277525  0.1321759   0.18895703  0.34498905  0.33700578\n",
      "  0.56124332  0.62045764  0.2725282   0.38563263  0.56616803  0.1606469\n",
      "  0.45637554  0.67732633  0.35744812  0.43952694  0.38532032  0.15712382\n",
      "  0.31039619  0.28074563  0.15723816  0.55088171  0.32401549  0.36176771\n",
      "  0.46374684  0.27147284  0.55654926  0.22560998  0.35503242  0.26396572\n",
      "  0.40699184  0.58337694  0.51452935  0.23428845  0.44861678  0.52746514\n",
      "  0.1980762   0.33703048  0.4683098   0.34509716  0.54286367  0.63241606\n",
      "  0.12593126  0.47180953  0.30898989  0.2732489   0.18975274  0.55260418\n",
      "  0.18304179  0.71959921  0.38207544  0.71822495  0.01566678  0.40884991\n",
      "  0.28772099  0.2417407   0.21673317  0.48564988  0.33034891  0.75619892\n",
      "  0.38923281  0.59916389  0.527652    0.30231175  0.51614655  0.29899056\n",
      "  0.66377134  0.35986564  0.32804286  0.47485578  0.34192812  0.43949074\n",
      "  0.07337267  0.44406598  0.2890204   0.42026897  0.40579652  0.37879122\n",
      "  0.31938068  0.27560805  0.17155081  0.47174054  0.19471148  0.38905245\n",
      "  0.39859628  0.29833695  0.22277973  0.44791396  0.47534835  0.42461937\n",
      "  0.43008505  0.48021625  0.25072686  0.32098756  0.48710522  0.39583313\n",
      "  0.02804873  0.40632182  0.08516179  0.29089303  0.3813857   0.1195547\n",
      "  0.72761315  0.53196954  0.23861919  0.24191009  0.27389737  0.49247097\n",
      "  0.31849141  0.2777376   0.0879182   0.36257675  0.3377424   0.3567824\n",
      "  0.46873985  0.49669807  0.50002121  0.23867533  0.28219359  0.35861601\n",
      "  0.2695359   0.3488351   0.2108465   0.57454061  0.69929342  0.57822247\n",
      "  0.42484577  0.32025918  0.33552995  0.21394251  0.3935867   0.19469354\n",
      "  0.38099944  0.32965038  0.42213138  0.36071282  0.23093986  0.65877349\n",
      "  0.32452891  0.78980595  0.40575561  0.43368304  0.38152736  0.31670699\n",
      "  0.0539999   0.44230466  0.44252354  0.3569722   0.33604482  0.43665225\n",
      "  0.31927624  0.50766494  0.25790898  0.80927746  0.65082119  0.40901698\n",
      "  0.41846398  0.19294936  0.60125587  0.22695044  0.41139032  0.30527564\n",
      "  0.30784848  0.48433907]\n",
      "[ 0.43603444  0.38931178  0.28057821  0.56212134  0.17022534  0.16120558\n",
      "  0.34520566  0.17442716  0.18705719  0.40433774  0.25847126  0.15539836\n",
      "  0.61181651  0.45657601  0.60797322  0.31661028  0.41699985  0.39338783\n",
      "  0.52461805  0.32352097  0.64064255 -0.02487039  0.78675495  0.40688758\n",
      "  0.31365643  0.40964035  0.37302725  0.48696111  0.38180502  0.64879677\n",
      "  0.42526438  0.06727581  0.27759638  0.10625873  0.34021426  0.17932981\n",
      "  0.2995379   0.46171484  0.15491028  0.28743858  0.42144389  0.522884\n",
      "  0.27067326  0.41521338  0.17871422  0.12604514  0.4901252   0.29794294\n",
      "  0.84869102  0.25162802  0.38009054  0.63971518  0.34921842  0.31272793\n",
      "  0.32432257  0.34833454  0.47616327  0.6703143   0.42831733  0.66406988\n",
      "  0.33821695  0.78205481  0.24237329  0.07696007  0.36352689  0.19139594\n",
      "  0.51170381  0.28373796  0.47903368  0.74786307  0.70758795  0.73512851\n",
      "  0.38076388  0.56738632  0.48906462  0.83342347  0.32402091  0.39938273\n",
      "  0.26410635  0.49628967  0.636515    0.4552168   0.48698618  0.40853503\n",
      "  0.75040948  0.35348486  0.63078964  0.6760725  -0.22109727  0.3124577\n",
      "  0.27056107  0.14714777  0.42531552  0.78792143  0.69749055  0.2110925\n",
      "  0.64414257  0.30338472  0.15060446  0.57607404  0.39258568  0.40719631\n",
      "  0.30136827  0.28545038  0.40970987  0.48567192  0.27861559  0.58583398\n",
      "  0.45593384  0.19543617  0.32653573  0.31825472  0.31036915  0.40226472\n",
      "  0.44607714  0.24471803  0.30981248  0.30791463  0.09982774  0.66491908\n",
      "  0.18336923  0.64379523  0.65614473  0.31064368  0.31928041 -0.01894824\n",
      "  0.13844349  0.10579635  0.30986234  0.12456704  0.47175948  0.24186908\n",
      "  0.32678988  0.72905398  0.49203714  0.36273334  0.52909675  0.51193936\n",
      "  0.54826833  0.55857613  0.30057476  0.17716972  0.84955645  0.39201935\n",
      "  0.22951296  0.17218144  0.72554798  0.61864201  0.18812034  0.33658\n",
      "  0.45491108  0.63618669  0.52209561  0.03842217  0.44797447  0.44394995\n",
      "  0.50508099 -0.08898211  0.6286069   0.68137369  0.20564144  0.34121203\n",
      "  0.54866077  0.56733436  0.63190993  0.45166738  0.26782576  0.35820537\n",
      "  0.29934534  0.5512067   0.46411155  0.38077625  0.31734445  0.14393903\n",
      "  0.45681271  0.31670743  0.37157395  0.19909836  0.58212704  0.79468165\n",
      "  0.34811986  0.41533668  0.44949053  0.28364238  0.34663796  0.50956989\n",
      "  0.44218893  0.42559057  0.51896766  0.32671302  0.69648932  0.21390405\n",
      "  0.28458534  0.42514362  0.31700944  0.29503104  0.46903054  0.24099068\n",
      "  0.49732372  0.44301744  0.32352012  0.65705129  0.18362038  0.38955486\n",
      "  0.24217215  0.71447325  0.55995567  0.38601776  0.49126242  0.31535821\n",
      "  0.26720569  0.27119022  0.40602729  0.4506      0.26299756  0.23972126\n",
      "  0.30642223  0.37457382  0.26267069  0.29950356  0.35416819  0.42640956\n",
      "  0.19583866  0.16084482  0.36044572  0.3735912   0.13191762  0.54579249\n",
      "  0.62271411  0.45948387  0.16008406  0.3153483   0.72783239  0.14216066\n",
      "  0.48877503  0.34699603  0.61779479  0.84462594  0.25419113  0.26257264\n",
      "  0.03158981  0.36343742  0.12950029  0.19039341  0.3465184   0.33699929\n",
      "  0.56121165  0.62020721  0.27161133  0.38723884  0.56804024  0.16097532\n",
      "  0.45752063  0.67976943  0.35676534  0.43850559  0.3847886   0.15821971\n",
      "  0.31024871  0.28055062  0.15717808  0.55097072  0.32451475  0.36055611\n",
      "  0.46291958  0.27167129  0.55650718  0.22597188  0.35498888  0.26348847\n",
      "  0.40455696  0.58656666  0.51729402  0.23241034  0.44707811  0.5278389\n",
      "  0.19655453  0.33823491  0.46781096  0.34362231  0.54386855  0.63492726\n",
      "  0.12347568  0.47185073  0.30934138  0.2734935   0.19028844  0.55471488\n",
      "  0.18079053  0.72057707  0.38031219  0.71897276  0.00948442  0.40797969\n",
      "  0.28766701  0.23985666  0.21668325  0.48698655  0.32903093  0.75872712\n",
      "  0.38974367  0.60014206  0.52885681  0.30196319  0.51644775  0.29970176\n",
      "  0.6642418   0.36042051  0.32634516  0.47564878  0.34212828  0.43888664\n",
      "  0.07229691  0.44113267  0.28825984  0.4202417   0.40441646  0.37739323\n",
      "  0.32005048  0.27501651  0.17051269  0.4719078   0.19488615  0.38751948\n",
      "  0.39899599  0.29829222  0.22111672  0.44781207  0.47467125  0.42375903\n",
      "  0.43052277  0.47859387  0.25135846  0.32107918  0.48826098  0.39569528\n",
      "  0.02776525  0.4053689   0.08431688  0.29115171  0.38024806  0.11889247\n",
      "  0.72933701  0.53303887  0.23830984  0.24207157  0.27559702  0.4926436\n",
      "  0.31696228  0.27749092  0.08695844  0.36358442  0.33809963  0.35588829\n",
      "  0.46865273  0.49641238  0.50077129  0.23912024  0.28122631  0.35900146\n",
      "  0.26849422  0.34509454  0.21075452  0.57668216  0.6994117   0.57802631\n",
      "  0.42351585  0.31919411  0.33365718  0.20720006  0.39110967  0.19360246\n",
      "  0.38063878  0.32946383  0.42165333  0.35989381  0.2320406   0.66100397\n",
      "  0.32496689  0.79364426  0.40663245  0.43383891  0.38171256  0.31708192\n",
      "  0.05049575  0.44221566  0.44232128  0.35665263  0.33506674  0.43737718\n",
      "  0.31901217  0.50723286  0.25838047  0.81110738  0.65308108  0.40925721\n",
      "  0.41845075  0.19342279  0.60151368  0.22582459  0.41131296  0.30489487\n",
      "  0.30656841  0.48583188]\n"
     ]
    }
   ],
   "source": [
    "print(y_train_pred_ridge)\n",
    "print(y_train_pred_lr)\n",
    "\n"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "- 岭回归的r2_score值在0.7以上, 比线性回归略大\n",
    "- 从真实值-预测值散点图来看，有部分预测值在0以下，小于最小值0\n",
    "- 真实值最高（等于1）的样本，其预测值偏离较大\n",
    "- 岭回归与线性回归拟合出的模型结果非常相近"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 24,
   "metadata": {},
   "outputs": [
    {
     "name": "stderr",
     "output_type": "stream",
     "text": [
      "C:\\Users\\dorot\\Anaconda3\\lib\\site-packages\\sklearn\\model_selection\\_split.py:1978: FutureWarning: The default value of cv will change from 3 to 5 in version 0.22. Specify it explicitly to silence this warning.\n",
      "  warnings.warn(CV_WARNING, FutureWarning)\n",
      "C:\\Users\\dorot\\Anaconda3\\lib\\site-packages\\sklearn\\model_selection\\_split.py:1978: FutureWarning: The default value of cv will change from 3 to 5 in version 0.22. Specify it explicitly to silence this warning.\n",
      "  warnings.warn(CV_WARNING, FutureWarning)\n"
     ]
    },
    {
     "name": "stdout",
     "output_type": "stream",
     "text": [
      "The r2 score of Lasso on test is 0.780654\n",
      "The r2 score of Lasso on train is 0.737120\n"
     ]
    },
    {
     "data": {
      "image/png": "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\n",
      "text/plain": [
       "<Figure size 288x216 with 1 Axes>"
      ]
     },
     "metadata": {
      "needs_background": "light"
     },
     "output_type": "display_data"
    },
    {
     "data": {
      "image/png": "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\n",
      "text/plain": [
       "<Figure size 432x288 with 1 Axes>"
      ]
     },
     "metadata": {
      "needs_background": "light"
     },
     "output_type": "display_data"
    }
   ],
   "source": [
    "\n",
    "from sklearn.linear_model import LassoCV\n",
    "\n",
    "lasso = LassoCV()\n",
    "lasso.fit( X_train, y_train)\n",
    "\n",
    "lasso.fit(X_train, y_train)\n",
    "y_test_pred_lasso = lasso.predict(X_test)\n",
    "y_train_pred_lasso = lasso.predict(X_train)\n",
    "# r2_score 评估模型性能\n",
    "print('The r2 score of Lasso on test is %.6f'  % r2_score(y_test, y_test_pred_lasso))\n",
    "print('The r2 score of Lasso on train is %.6f'  % r2_score(y_train, y_train_pred_lasso))\n",
    "# 观察预测值与真值的散点图\n",
    "# plt.clf\n",
    "plt.figure(figsize=(4,3))\n",
    "plt.scatter(y_train, y_train_pred_lasso)\n",
    "plt.plot([0,1],[0,1], '--k')\n",
    "plt.axis('tight')\n",
    "plt.xlabel('true price')\n",
    "plt.ylabel('predicted price')\n",
    "plt.tight_layout()\n",
    "plt.show()\n",
    "\n",
    "mses = np.mean(lasso.mse_path_, axis=1)\n",
    "plt.plot(np.log10(lasso.alphas_), mses)\n",
    "plt.xlabel('log(alpha)')\n",
    "plt.ylabel('mse')\n",
    "plt.show()\n"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "- Lasso模型的r2_score值在0.7以上, 比线性回归略大\n",
    "- 从真实值-预测值散点图来看，有部分预测值在0以下，小于最小值0\n",
    "- 真实值最高（等于1）的样本，其预测值偏离较大\n",
    "- Lasso模型与岭回归、线性回归拟合出的模型结果非常相近"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "# 5. 代码中给出了岭回归（RidgeCV）和Lasso（LassoCV）超参数（alpha_）调优的过程，请结合两个最佳模型以及最小二乘线性回归模型的结果，给出什么场合应该用岭回归，什么场合用Lasso，什么场合用最小二乘。"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "- 最小二乘法是线性回归模型中最基础的解法，没有加入正则项，容易产生过拟合。在使用时，如果样本量足够多，或交叉检验的次数足够多，总之可以从其他方面抵消过拟合的情况，可以使用最小二乘线性回归。\n",
    "- 岭回归（RidgeCV）使用L2损失+L2正则项，即通过自变量系数的平方加和进行优化。挑选合适的参数$\\lambda$以减弱过拟合的情况\n",
    "- Lasso（LassoCV）使用L2损失+L1正则，即通过自变量系数的绝对值加和进行优化。对自变量系数有挑选作用。如果自变量较多，需要按重要性筛选则需要使用Lasso\n"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": null,
   "metadata": {},
   "outputs": [],
   "source": []
  }
 ],
 "metadata": {
  "kernelspec": {
   "display_name": "Python 3",
   "language": "python",
   "name": "python3"
  },
  "language_info": {
   "codemirror_mode": {
    "name": "ipython",
    "version": 3
   },
   "file_extension": ".py",
   "mimetype": "text/x-python",
   "name": "python",
   "nbconvert_exporter": "python",
   "pygments_lexer": "ipython3",
   "version": "3.7.3"
  }
 },
 "nbformat": 4,
 "nbformat_minor": 2
}
